//游戏交互逻辑文件

//keydown事件表示键盘被按下
$(document).keydown(function(event){
    switch(event.keyCode){
        //左
        case 37:
            //moveLeft()方法完成向左移动的逻辑，
            //返回值是Boolean类型,判断是否可以向左移动
            if (moveLeft()){
                //重新随机生成一个数字
                generateOneNumber();
                //判断这次移动过后 游戏是否结束
                isgameover();
            }
            break;
        //上
        case 38:
            if(moveUp()){
                generateOneNumber();
                isgameover();
            }
            break;
        //右
        case 39:
            if(moveRight()){
                generateOneNumber();
                isgameover();
            }
            break;
        //下
        case 40:
            if(moveDown()){
                generateOneNumber();
                isgameover();
            }
            break;
        default:
            break;
    }
});

//向左移动的方法
function moveLeft(){
    //返回值是Boolean类型，判断是否可以向左移动
    if(!canMoveLeft(board)){
        //当前的格子无法移动
        return false;
    }
    //完成向左移动的逻辑
    for(var i=0;i<4;i++){
        //因为第一列无法继续向左移动 所以j从1开始
        for(var j=1;j<4;j++){
            //当前数字格有值(2,4,8...不可以是0)
            if(board[i][j]!=0){
                //向左移动的逻辑
                for(var k=0;k<j;k++){
                    //可以向左移动
                    if(board[i][k]==0 && noBlokHorizontalColLeft(i,k,j,board)){
                        showMoveAnimation(i,j,i,k);
                        board[i][k]=board[i][j];
                        board[i][j]=0;
                    }
                    //值相登叠加可以向左移动
                    else if(board[i][k]==board[i][j] && noBlokHorizontalColLeft(i,k,j,board) && !hasConflicted[i][k]){
                        showMoveAnimation(i,j,i,k);
                        //值相登进行叠加
                        board[i][k]+=board[i][j];
                        board[i][j]=0;
                        hasConflicted[i][k]=true;
                        //刷新游戏得分
                        score+=board[i][k]
                        updateScore(score);
                        continue;
                    }
                }
            }
        }
    }
    //重新布局数字格
    setTimeout("updateBoardView();",200);
    return true;
}

//向上移动的方法
function moveUp(){
    //返回值是Boolean类型，判断是否可以向左移动
    if(!canMoveUp(board)){
        //当前的格子无法移动
        return false;
    }
    //完成向左移动的逻辑
    //因为第一行无法继续向上移动 所以i从1开始
    for(var i=1;i<4;i++){
        for(var j=0;j<4;j++){
            //当前数字格有值(2,4,8...不可以是0)
            if(board[i][j]!=0){
                //向上移动的逻辑
                for(var k=0;k<i;k++){
                    //可以向上移动k j
                    if(board[k][j]==0 && noBlokHorizontalRowUp(j,k,i,board)){
                        showMoveAnimation(i,j,k,j);
                        board[k][j]=board[i][j];
                        board[i][j]=0;
                    }
                    //值相登叠加可以向上移动
                    else if(board[k][j]==board[i][j] && noBlokHorizontalRowUp(j,k,i,board) && !hasConflicted[k][j]){
                        showMoveAnimation(i,j,k,j);
                        //值相登进行叠加
                        board[k][j]+=board[i][j];
                        board[i][j]=0;
                        hasConflicted[k][j]=true;

                        //刷新游戏得分
                        score+=board[k][j]
                        updateScore(score);
                        continue;
                    }
                }
            }
        }
    }
    //重新布局数字格
    setTimeout("updateBoardView();",200);
    return true;
}

//向右移动的方法
function moveRight(){
    //返回值是Boolean类型，判断是否可以向左移动
    if(!canMoveRight(board)){
        //当前的格子无法移动
        return false;
    }
    //完成向右移动的逻辑
    for(var i=0;i<4;i++){
        //因为第4列无法继续向右移动 所以j<3
        for(var j=2;j>=0;j--){
            //当前数字格有值(2,4,8...不可以是0)
            if(board[i][j]!=0){
                //向右移动的逻辑
                for(var k=3;k>j;k--){
                    //可以向右移动
                    if(board[i][k]==0 && noBlokHorizontalColRight(i,k,j,board)){
                        showMoveAnimation(i,j,i,k);
                        board[i][k]=board[i][j];
                        board[i][j]=0;
                    }
                    //值相登叠加可以向右移动
                    else if(board[i][k]==board[i][j] && noBlokHorizontalColRight(i,k,j,board) && !hasConflicted[i][k]){
                        showMoveAnimation(i,j,i,k);
                        //值相登进行叠加
                        board[i][k]+=board[i][j];
                        board[i][j]=0;
                        hasConflicted[i][k]=true;
                        //刷新游戏得分
                        score+=board[i][k]
                        updateScore(score);
                        continue;
                    }
                }
            }
        }
    }
    //重新布局数字格
    setTimeout("updateBoardView();",200);
    return true;
}

//向下移动的方法
function moveDown(){
    //返回值是Boolean类型，判断是否可以向下移动
    if(!canMoveDown(board)){
        //当前的格子无法移动
        return false;
    }
    //完成向下移动的逻辑
    //因为第4行无法继续向右移动 所以i=2
    for(var i=2;i>=0;i--){
        for(var j=0;j<4;j++){
            //当前数字格有值(2,4,8...不可以是0)
            if(board[i][j]!=0){
                //向下移动的逻辑
                for(var k=3;k>i;k--){
                    //可以向下移动
                    if(board[k][j]==0 && noBlokHorizontalColRight(j,k,i,board)){
                        showMoveAnimation(i,j,k,j);
                        board[k][j]=board[i][j];
                        board[i][j]=0;
                    }
                    //值相登叠加可以向下移动
                    else if(board[k][j]==board[i][j] && noBlokHorizontalColRight(j,k,i,board) && !hasConflicted[k][j]){
                        showMoveAnimation(i,j,k,j);
                        //值相登进行叠加
                        board[k][j]+=board[i][j];
                        board[i][j]=0;
                        hasConflicted[k][j]=true;
                        //刷新游戏得分
                        score+=board[k][j]
                        updateScore(score);
                        continue;
                    }
                }
            }
        }
    }
    //重新布局数字格
    setTimeout("updateBoardView();",200);
    return true;
}

//判断游戏是否结束
function isgameover(){
    if(nospace(board) && nomove(board)){
        gameover();
    }
}

//游戏如果结束弹出提示框
function gameover(){
    alert("游戏结束！")
    $("#grid-container").append("<div id='gameover' class='gameover'><p>本次得分</p><span>"+score+"</span><a href='javascript:restartgame();'id='restartgamebutton'>再来一局</a><div>");
    var gameover=$("#gameover");
    gameover.css("width","500px");
    gameover.css("height","500px");
    gameover.css("background-color","rgba(0,0,0,0.5)");
}
